import DB from "./sqldb.js";

/**添加或者更新菜单数据,主键是id
 * @param {Object} item 单个菜单信息
 * @param {Number} item.id 主键
 * @param {String} item.name 名称
 * @param {Number} item.father_id 父菜单id
 * @param {Number} item.user 用户名
 */
async function recordSalary(item) {
	console.log(item, "item");
	// 新增 DB.insertTableData(表名, 对应表头列的数据)
	let sql = `${item.id},'${item.name}','${item.father_id}',${item.user}`;
	let condition = "'id','name','father_id','user'";
	let result = await DB.insertOrReplaceData(DB.recordsTable, sql, condition);
	console.log("添加/更新分类成功", result);
	return result;
}

/**
 * 添加、更新歌曲数据，id为主键
 * @param {Object} item 单个歌曲信息
 * @param {Number} item.id 主键
 * @param {String} item.name 歌曲名称
 * @param {String} item.usls 歌曲url
 * @param {String} item.type 0表示图谱乐谱，1表示PDF乐谱
 * @param {String} item.author 乐谱作者
 * @param {String} item.album 乐谱类型
 * @param {String} item.father_id 分类id
 * @param {Number} item.user 用户名
 */
async function recordSong(item) {
	try {
		let sql =
			`${item.id},'${item.name}','${item.usls}','${item.type}','${item.author}','${item.album}',${item.father_id}, ${item.user}`;
		let condition = "'id','name','urls','type','author','album','father_id','user'";
		let result = await DB.insertOrReplaceData(DB.songsTable, sql, condition);
		console.log(result, "添加/更新歌曲成功");
		return result;
	} catch (e) {
		throw e;
	}
}

/***
 * 添加、更新图片数据，id为主键
 * @param {Object} item 单个图片信息
 * @param {Number} item.id 主键
 * @param {String} item.url 图片url
 * @param {String} item.father_id 图片父级id
 */
async function recordImage(item) {
	try {
		let sql = `${item.id},'${item.url}',${item.father_id}`;
		let condition = "'id','url','father_id'";
		let result = await DB.insertOrReplaceData(DB.imagesTable, sql, condition);
		console.log(result, "添加/更新图片成功");
		return result;
	} catch (e) {
		throw e;
	}
}


/**
 * 添加更新权限
 */
async function recordPower(item) {
	try {
		let sql = `${item.id},'${item.code}'`;
		let condition = "'id','code'";
		let result = await DB.insertOrReplaceData(DB.powerTable, sql, condition);
		console.log(result, "添加/更新权限成功");
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 查询所有的权限信息
 * @returns {Array} 权限信息数组
 */
async function getAllPower() {
	try {
		let result = await DB.selectTableData(DB.powerTable);
		return result;
	} catch (e) {
		throw e;
	}
}

/** 
 * 查询所有分类信息
 * @returns {Array} 分类信息数组
 */
async function getAllCategories() {
	try {
		let result = await DB.selectTableData(DB.recordsTable);
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 根据表明查询最大值ID
 * @param {Number} val 表名
 * @returns {Number} ID最大值
 */
async function getMaxIdByTableName(val) {
	try {
		let table = [DB.recordsTable, DB.songsTable, DB.imagesTable, DB.powerTable][val];
		let result = await DB.getMaxId(table);
		return result[0].maxid;
	} catch (e) {
		throw e;
	}
}

/**
 * 根据表明查询数量
 * @param {Number} val 表名
 * @param {String} sql sql条件
 * @returns {Number} ID最大值
 */
async function getCountByTableName(val, sql) {
	try {
		let table = [DB.recordsTable, DB.songsTable, DB.imagesTable][val];
		let result = await DB.countTableData(table, sql);
		return result[0].count;
	} catch (e) {
		throw e;
	}
}

/**
 * 根据分类id查询所有歌曲信息
 * @returns {Number} father_id 歌曲归属分类ID
 */
async function getSongsByCategory(id) {
	try {
		let searchCondition = `WHERE father_id=${id}`;
		let result = await DB.selectTableData(DB.songsTable, searchCondition);
		console.log("查询的数据新闻", result)
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 根据歌曲id查询歌曲信息
 * @returns {Number} id 歌曲id
 */
async function getSongById(id) {
	try {
		let searchCondition = `WHERE id=${id}`;
		let result = await DB.selectTableData(DB.songsTable, searchCondition);
		return result[0];
	} catch (e) {
		throw e;
	}
}

/***
 * 根据father_id查询图片信息
 * @returns {Number} father_id 图片父级id
 */
async function getImagesByFatherId(id) {
	try {
		let searchCondition = `WHERE father_id=${id}`;
		let result = await DB.selectTableData(DB.imagesTable, searchCondition);
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 根据id删除分类或歌曲信息
 * @param {Number} id 主键id
 * @param {String} index 类型，0表示分类，1表示歌曲
 */
async function deleteRecord(id, index) {
	try {
		let table = [DB.recordsTable, DB.songsTable, DB.imagesTable][index];
		let sql = `WHERE id=${id}`;
		let result = await DB.deleteTableData(table, sql);
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 根据ID修改分类或歌曲信息
 */
async function updateRecord(id, name, index) {
	try {
		let table = [DB.recordsTable, DB.songsTable, DB.imagesTable][index];
		let sql = `name = ${name}`;
		let result = await DB.updateTableData(table, sql, 'id', id);
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 根据sql查询乐谱表格对应数据
 * @param {String} sql语句
 */
async function queryTableData(sql) {
	try {
		let result = await DB.selectTableData(DB.songsTable, sql);
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 模糊查询歌曲信息
 * @param {String} keyword 关键字
 */
async function searchSong(keyword) {
	try {
		let sql = `WHERE name LIKE '%${keyword}%'`;
		let result = await DB.selectTableData(DB.songsTable, sql);
		return result;
	} catch (e) {
		throw e;
	}
}

/**
 * 创建json文件
 * @param {Array} data 所有乐谱图片数据
 * @param {Number} id 图片所属的父级id
 */
function createFlie(data, id) {
	return new Promise((resolve, reject) => { //这里封装了个是一个promise异步请求
		// plus.io.requestFileSystem是请求本地文件系统对象
		plus.io.requestFileSystem(
			plus.io.PRIVATE_DOC, // 文件系统中的根目录下的DOCUMENTS目录
			fs => {
				// 创建或打开文件, fs.root是根目录操作对象,直接fs表示当前操作对象
				fs.root.getFile('f' + id + '.json', {
					create: true // 文件不存在则创建
				}, fileEntry => {
					// 文件在手机中的路径
					// console.log(fileEntry.fullPath)
					fileEntry.createWriter(writer => {
						// 写入文件成功完成的回调函数
						writer.onwrite = e => {
							resolve("写入本地文件")
						};
						// 写入数据
						writer.write(JSON.stringify(data));
					})
				}, e => {
					reject("写入失败")
					console.log("getFile failed: " + e.message);
				});
			},
			e => {
				console.log(e.message);
			}
		);
	})
}

/**
 * 查询images的Json文件
 * @param {Number} id 父级id
 */
function getFileData(id) {
	return new Promise((resolve, reject) => { //文件读写是一个异步请求 用promise包起来方便使用时的async+await
		plus.io.requestFileSystem(
			plus.io.PRIVATE_DOC,
			fs => {
				fs.root.getFile(`f${id}.json`, {
					create: false
				}, fileEntry => {
					fileEntry.file((file) => {
						console.log("文件大小:" + file.size + '-- 文件名:' + file.name);
						//创建读取文件对象
						let fileReader = new plus.io.FileReader();
						//以文本格式读取文件数据内容
						fileReader.readAsText(file, 'utf-8');
						//文件读取操作完成时的回调函数
						fileReader.onloadend = (evt) => {
							resolve(JSON.parse(evt.target.result))
						}
					});
				}, e => {
					reject(e)
					console.log("getFile failed: " + e.message);
				});
			},
			e => {
				console.log(e.message);
			}
		);
	})
}

/**
 * 删除images的Json文件
 * @param {Number} id 父级id
 */
function getFileList(path) {
	return new Promise(resolve => { //文件读写是一个异步请求 用promise包起来方便使用时的async+await
		//  io.dcloud.HBuilder 是真机调试的包名，，
		//"/storage/emulated/0/Android/data/io.dcloud.HBuilder/documents"
		//  如果要进行打包那么就要改成你打包包名，比如我的包名是uni.UNIACE0B00那就改成
		//  "/storage/emulated/0/Android/data/uni.UNIACE0B00/documents"
		plus.io.requestFileSystem(
			plus.io.PRIVATE_DOC, //指定的目录
			function(entry) {
				var directoryReader = entry.createReader(); //获取读取目录对象
				directoryReader.readEntries(
					function(entries) {
						console.log("查询的数据", entries)
						resolve(entries)
						//entries目录是一个数字遍历就能得到文件了，如下
						// for (var i = 0; i < entries.length; i++) {
						//  //  　entries[i].remove();  //这是删除指定的文件
						//  console.log("文件信息：" + entries[i].name);
						// }
					},
					function(err) {
						uni.showToast({
							title: "访问目录失败:" + err.message,
							duration: 2000
						})
						console.log("访问目录失败");
					});
			},
			function(err) {
				// uni.showToast({
				//  title: "访问指定目录失败:" + err.message,
				//  duration: 2000
				// })
				console.log("访问指定目录失败:" + err.message);
			});
	})
}

export default {
	recordSalary,
	recordSong,
	recordImage,
	getAllCategories,
	getSongsByCategory,
	getSongById,
	getImagesByFatherId,
	deleteRecord,
	updateRecord,
	getCountByTableName,
	getMaxIdByTableName,
	queryTableData,
	searchSong,
	getFileList,
	createFlie,
	getFileData,
	recordPower,
	getAllPower
}

// 上述使用方法如下：
// import API from './api.js';
// API.recordSalary({id: 1, name: '分类1', father_id: 0}); // 添加/更新分类
// API.recordSong({id: 1, name: '歌曲1', usls: 'http://www.example.com/1.pdf', type: 1, author: '作者1', album: '专辑1', father_id: 1}); // 添加/更新歌曲